package odontologico.dao.base;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;

import odontologico.dao.base.utils.EntityManagerUtils;

//FIXME lverbel buscar la forma corecta de buscar cualquier clase fa
@NamedQueries(value = { @NamedQuery(name = BaseDao.findById, query = "From T WHERE id = :id ") })
public abstract class BaseDao<T> implements InterfaceOperacionesBaseDao<T> {

	private EntityManager entityManager;

	public static final String findById = "findById";

	@Override
	public T guardar(T entidad) {

		return this.getEntityManager().merge(entidad);
	}

	@Override
	public void eliminar(T entidad) {
		this.getEntityManager().remove(entidad);
	}

	@Override
	public T buscarPorId(long id) {

		// TODO esta mal hay que hacerlo
		this.entityManager = this.getEntityManager();
		javax.persistence.Query query = this.entityManager.createNamedQuery(findById);
		return (T) query.getSingleResult();
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<T> buscarTodas() {
		// TODO esta mal hay que hacerlo
		this.entityManager = this.getEntityManager();
		javax.persistence.Query query = this.entityManager.createNamedQuery(findById);
		return (List<T>) query.getResultList();
	}

	private EntityManager getEntityManager() {

		return EntityManagerUtils.getEntityManager();
	}

}
